#include "widget.h"
#include "ui_widget.h"
#include <QRegExpValidator>

Widget::Widget(QWidget *parent)
    : QWidget(parent)
    , ui(new Ui::Widget)
{
    ui->setupUi(this);

    line_edit=new QLineEdit(this);
    line_edit->setGeometry(100,200,400,100);

    button=new QPushButton(this);
    button->setText("提交");
    button->setGeometry(250,320,100,50);
    //使这个按钮失能
    button->setEnabled(false);

    //这个输入框line_edit要检查输入的内容是否是合法的手机号码
    //如果是合法的，则按钮为可用状态
    //如果是非法的，则按钮为禁用状态

    //给单行输入框设置验证其，基于正则表达式完成验证
    QRegExp regExp("^1\\d{10}$");//正则表达式
    /* 一个简单的验证电话的正则表达式
     * "^1\\d{10}$"
     * ^1：以1开头
     * \d:表示数字，这里需要将\d作为整体，需要使用转义字符(\)
     * {10}:表示前面的数字必须重复出现10次
     * \\d{10}:表示必须出现10次数字
     * $:表示结尾
    */
    //验证器对象，传递正则表达式对象
    QRegExpValidator* lidator=new QRegExpValidator(regExp);//此对象会自动销毁
    //为单行输入框控件设置验证器，传递验证器
    line_edit->setValidator(lidator);
    //连接槽函数
    //&QLineEdit::textEdited信号：输入框中的内容发生改变就触发信号
    connect(line_edit,&QLineEdit::textEdited,this,&Widget::handler);
}

Widget::~Widget()
{
    delete ui;
}

//验证输入框的内容是否合法
//只要输入框中的内容发生改变了，验证操作就应该被执行
void Widget::handler(const QString &text)
{
    //text参数就是当前输入框中的内容
    QString content=text;//要验证的字符串
    int pos;//出错位置
    //line_edit->validator()获取此输入框中的验证器
    //验证器的validate(QString &,int &)方法用于验证此输入框中的内容是否符合要求(用正则表达式规则进行验证)
    //QString &参数：要验证的字符串内容
    //int &参数：如果要验证的字符串内容不合格，则返回首次出错的位置
    if(line_edit->validator()->validate(content,pos)==QValidator::Acceptable)
    {
        //QValidator::Acceptable  合法
        //QValidator::Invalid  不合法
        //将按钮设置为可用状态
        button->setEnabled(true);
    }
    else
    {
        //将按钮设置为不可用状态
        button->setEnabled(false);
    }
}

